package com.itheima.ui;

import javax.swing.*;
import java.awt.*;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.List;

public class ClientChatFrame extends JFrame {

    private JTextArea messageDisplay;
    private JScrollPane scrollPane;
    private JTextField messageInput;
    private JButton sendButton;
    private JPanel inputPanel;
    private JPanel onlineUsersPanel;
    private JLabel onlineCount;
    private JTextArea onlineUsers;

    private Socket socket;

    public ClientChatFrame() {
        setTitle("群聊窗口");
        setSize(800, 600);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 初始化组件
        messageDisplay = new JTextArea();
        messageDisplay.setEditable(false);
        scrollPane = new JScrollPane(messageDisplay);

        messageInput = new JTextField();
        messageInput.setPreferredSize(new Dimension(600, 150)); // 调整输入框高度

        sendButton = new JButton("发送");

        //给发送按钮绑定点击事件
        sendButton.addActionListener(e -> {

            // 获取输入框中的消息
            String message = messageInput.getText();
            // 清空输入框
            messageInput.setText("");
            // 把消息发送到服务端
            sendMessageToServer(message);
        });

        onlineCount = new JLabel("在线人数: 0");

        onlineUsers = new JTextArea();
        onlineUsers.setEditable(false);
        onlineUsers.setLineWrap(true); // 自动换行
        onlineUsers.setWrapStyleWord(true); // 断词换行

        // 创建一个新的面板，并设置其布局为 GridBagLayout
        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new GridBagLayout());

        // GridBag约束
        GridBagConstraints gbc = new GridBagConstraints();

        // 设置消息展示框的位置和大小
        gbc.gridx = 0; // 列位置
        gbc.gridy = 0; // 行位置
        gbc.gridwidth = 1; // 占用一列
        gbc.weightx = 1.0; // 水平拉伸权重
        gbc.weighty = 1.0; // 垂直拉伸权重
        gbc.fill = GridBagConstraints.BOTH; // 填充模式
        mainPanel.add(scrollPane, gbc);

        // 创建一个垂直Box布局的面板来容纳输入框和发送按钮
        inputPanel = new JPanel();
        inputPanel.setLayout(new BoxLayout(inputPanel, BoxLayout.X_AXIS));
        inputPanel.add(messageInput);
        inputPanel.add(Box.createHorizontalGlue()); // 使按钮靠右
        inputPanel.add(sendButton);
        inputPanel.setAlignmentX(Component.LEFT_ALIGNMENT);

        // 设置输入框和按钮的位置和大小
        gbc.gridy = 1;
        gbc.gridwidth = 1;
        gbc.weighty = 0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        mainPanel.add(inputPanel, gbc);

        // 设置在线人数框的位置和大小
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 0;
        gbc.weighty = 1;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.anchor = GridBagConstraints.NORTHWEST;
        gbc.gridheight = 2; // 跨两行
        gbc.insets = new Insets(5, 5, 5, 5); // 内边距
        onlineUsersPanel = new JPanel();
        onlineUsersPanel.setLayout(new BorderLayout());
        onlineUsersPanel.add(onlineCount, BorderLayout.NORTH);
        onlineUsersPanel.add(new JScrollPane(onlineUsers), BorderLayout.CENTER);
        mainPanel.add(onlineUsersPanel, gbc);

        // 添加面板到窗口
        add(mainPanel);

        // 让窗口居中显示
        setLocationRelativeTo(null);

        // 设置窗口可见
        setVisible(true);
    }

    private void sendMessageToServer(String message) {
        // 把消息发送到服务端
        try {
            //1.从Socket管道中获取一个特殊数据输出流
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
            //2.通过数据输出流把消息发送到服务端
            dos.writeInt(2);
            dos.writeUTF(message);
            dos.flush();

        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    public ClientChatFrame(String nickname, Socket socket) {
        //先调用上面的构造器，初始化界面信息
        this();
        //立马展示昵称到窗口标题
        setTitle(nickname + "的聊天窗口");

        this.socket = socket;

        //立即把客户端Socket交给一个独立的线程专门负责读取客户端Socket从服务端收到的在线人数更新消息/群聊消息
        new ClientThread(socket,this).start();


    }

    public static void main(String[] args) {
            new ClientChatFrame();
    }

    public void updateOnlineUserList(List<String> onlineNicknames) {
        //把这个线程读取到的在线用户名称展示到到界面的在线人数框上
        onlineUsers.setText("");
        for (String nickname : onlineNicknames) {
            onlineUsers.append(nickname + "\n");
        }
        onlineCount.setText("在线人数: " + onlineNicknames.size());

    }

    public void setMessageToWin(String msg) {
        //把从服务端读取到的群聊消息展示到界面的消息展示框上
        messageDisplay.append(msg + "\n");

    }
}